Мы будем менять предыдущий проект для того, чтобы добавить функции слежения за соединением. Для этого в классе CInternetSession предусмотрена виртуальная функция OnStatusCallback.
Сначало нам надо породить новый класс от класса CInternetSession. Для этого мы пойдем в меню Insert и выберем функцию New Class. И дальше тип Generic class. Вот так:

После того, как Вы нажмете OK вам скажут, что не могут найти класс CInternetSession, ну и ладно. Нажмите опять OK. VC++ создаст класс. Вот теперь надо объяснить ему, что CInternetSession существует.
// StatusInternetSession.h: interface for the CStatusInternetSession class. // ////////////////////////////////////// ...... #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "afxinet.h" ......
Теперь мы можем перегрузить функцию OnStatusCallback.
// StatusInternetSession.h: interface for the CStatusInternetSession class.
//
/////////////////////////////////////
#if !defined(AFX_STATUSINTERNETSESSION_H__5219D0D4_B248_11D4_9413_ACE82DCCA163__INCLUDED_)
#define AFX_STATUSINTERNETSESSION_H__5219D0D4_B248_11D4_9413_ACE82DCCA163__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "afxinet.h"
class CStatusInternetSession : public CInternetSession
{
public:
CStatusInternetSession();
virtual ~CStatusInternetSession();
void OnStatusCallback(DWORD dwContext,
DWORD dwInternetStatus,LPVOID lpvStatusInformation,
DWORD dwStatusInformationLength);
};
#endif // !defined(AFX_STATUSINTERNETSESSION_H__5219D0D4_B248_11D4_9413_ACE82DCCA163__INCLUDED_)
// StatusInternetSession.cpp: implementation of the CStatusInternetSession class.
//
////////////////////////////////////////
#include "stdafx.h"
#include "TestHTTP.h"
#include "StatusInternetSession.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////
// Construction/Destruction
//////////////////////////////
CStatusInternetSession::CStatusInternetSession()
{
}
CStatusInternetSession::~CStatusInternetSession()
{
}
void CStatusInternetSession::OnStatusCallback(DWORD dwContext,
DWORD dwInternetStatus, LPVOID lpvStatusInformation,
DWORD dwStatusInformationLength)
{
}
Теперь надо научить наш класс диалогового окна новым классам:
// TestHTTPDlg.cpp : implementation file
//
#include "stdafx.h"
#include "TestHTTP.h"
#include "TestHTTPDlg.h"
#include "StatusInternetSession.h"
#ifdef _DEBUG
......
void CTestHTTPDlg::OnButton1()
{
CStatusInternetSession session;
CHttpConnection* pHttpCon = session.GetHttpConnection("http://www.firststeps.ru/");
......
}
Вся предварительная подготовка закончена. И изменим нашу функцию слежения:
void CStatusInternetSession::OnStatusCallback(DWORD dwContext,
DWORD dwInternetStatus,LPVOID lpvStatusInformation,
DWORD dwStatusInformationLength)
{
switch(dwInternetStatus)
{
case INTERNET_STATUS_RESOLVING_NAME:
TRACE("Look IP\n");
break;
case INTERNET_STATUS_NAME_RESOLVED:
TRACE("Yes IP\n");
break;
default:
TRACE("Not Info\n");
break;
}
Константы статуса описаны в файле WinInet.h:
// // status manifests for Internet status callback // #define INTERNET_STATUS_RESOLVING_NAME 10 #define INTERNET_STATUS_NAME_RESOLVED 11 #define INTERNET_STATUS_CONNECTING_TO_SERVER 20 #define INTERNET_STATUS_CONNECTED_TO_SERVER 21 ......
Для того, чтобы сообщения можно было обрабатывать в функции слежения это надо еще разрешить.
void CTestHTTPDlg::OnButton1()
{
CStatusInternetSession session;
session.EnableStatusCallback(TRUE);
......
}
Запустим приложение и посмотрим на его вывод в окне Debug. Примерно так:
Loaded 'C:\WINDOWS\SYSTEM\MSNET32.DLL', no matching symbolic information found. Look IP Loaded 'C:\WINDOWS\SYSTEM\RNR20.DLL', no matching symbolic information found. Loaded 'C:\WINDOWS\SYSTEM\MSAFD.DLL', no matching symbolic information found. Yes IP Not Info ......
Что и требовалось мы следим за соединением.